<?php
class  Grades{
    //评分判定方法
    public  function  grade($arr,$status_key,$key,$val){
        $status[$status_key]['count']=0;
        foreach ($arr[$key] as $l=>$v){
            $where[$l]=explode('-',$l);
            //利用过滤方法进行范围判断过滤,比如某个值是否 0-1之间,满足条件的加分
            $res= filter_var($where[$l][0].'-'.$val.'-'.$where[$l][1], FILTER_CALLBACK, ["options"=>function($string){
                $arr=explode('-',$string);

                if($arr[1]>=$arr[0] && $arr[1]<=$arr[2]){
                    return true;
                }
                return false;
            }]);
            //符合规则
            if($res){
                $status[$status_key]['count']=$v;
            }
        }
        return $status[$status_key]['count'];
    }

    //执行算法得出结果
    public  function  execute($status,$option){
        $count=[];
        //循环每个服务器
        foreach ($status as $url=>$s){
            $count[$url]=0;
            /*if(isset($option['load'])){
                $count[$url]+=$this->grade($option,$url,'load',$s[0]);
            }
            if(isset($option['connection_num'])){
                $count[$url]+=$this->grade($option,$url,'connection_num',$s[1]);
            }
            if(isset($option['tasking'])){
                $count[$url]+=$this->grade($option,$url,'tasking',$s[2]);
            }*/
            //遍历所有key,对于每个选项进行评分
            array_map(function($k,$c) use($url,$option,$s,&$count){
                $count[$url]+=$this->grade($option,$url,$k,$s[$c]);
            },array_keys($option),range (0,count($option)-1));
        }

        var_dump($count);
        //判断是否有重复的值,也就分数相同的结果，如果有就随机选取一个，如果没有选取一个分数最高的
        if(count($count)!=count(array_unique($count))){
            return array_rand($count);
        }else{
            return array_search(max($count),$count);
        }
    }
}


//范围判断
//function load_range($string)
//{
//   $arr=explode('-',$string);
//   if($arr[1]>=$arr[0] && $arr[1]<=$arr[2]){
//      return true;
//   }
//     return false;
//}
////评分判定方法
//function  grade($arr,$status_key,$key,$val){
//    $status[$status_key]['count']=0;
//    foreach ($arr[$key] as $l=>$v){
//        $where[$l]=explode('-',$l);
//        $res= filter_var($where[$l][0].'-'.$val.'-'.$where[$l][1], FILTER_CALLBACK, ["options"=>"load_range"]);
//        if($res){
//            echo '在范围之内'.PHP_EOL;
//            $status[$status_key]['count']=$v;
//            // break;
//        }
//    }
//    return $status[$status_key]['count'];
//}




/*
 *
 *  设定一些条件，满足相关条件，就加上相应的分数，最终选择一个分数得分最高的一个ip，
    比如任务排队数在某个范围之内+10分
 */



/*
 * 格式
 * 选项=>[
 *   "范围"=>"分数"
 * ]
*/
/*$options=[
    'load'=>[  //系统负载
        '0-1'=>20,
        '1-2'=>10,
        '2-'=>0
    ],
    'connection_num'=>[  //连接数
        '0-100'=>20,
        '100-200'=>10,
        '200-300'=>5,
        '300-'=>0
    ],
    'tasking'=>[    //任务排队数
        '0-10'=>10,
        '10-20'=>5,
        '20-'=>0
    ]
];*/

/*
 * 格式
 * "ip地址:端口"=>['负载情况','连接数','任务排队数']
 * */
//(购物车服务)某个服务所有机器的状态
/*$status=[
    '1.1.1.1.1:80'=>[5,60,10],
    '1.1.1.1.2:8080'=>[5,60,10],
    '1.1.1.1.3:9090'=>[5,60,10]
];*/

